package com.cold.demo.webflux.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import reactor.core.publisher.Flux;

import java.time.Duration;
import java.util.Arrays;

@Controller
public class FluxController {
//    @GetMapping(value = "/zip", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object zip() {
//        return Flux.zip();
//    }
//
//    @GetMapping(value = "/usingWhen", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object usingWhen() {
//        return Flux.usingWhen();
//    }
//
//    @GetMapping(value = "/using", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object using() {
//        return Flux.using();
//    }
//
//    @GetMapping(value = "/switchOnNext", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object switchOnNext() {
//        return Flux.switchOnNext();
//    }
//
//    @GetMapping(value = "/range", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object range() {
//        return Flux.range();
//    }
//
//    @GetMapping(value = "/push", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object push() {
//        return Flux.push();
//    }
//
//    @GetMapping(value = "/never", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object never() {
//        return Flux.never();
//    }
//
//    @GetMapping(value = "/mergeSequentialDelayError", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object mergeSequentialDelayError() {
//        return Flux.mergeSequentialDelayError();
//    }
//
//    @GetMapping(value = "/mergeSequential", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object mergeSequential() {
//        return Flux.mergeSequential();
//    }
//
//    @GetMapping(value = "/mergeOrdered", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object mergeOrdered() {
//        return Flux.mergeOrdered();
//    }
//
//    @GetMapping(value = "/mergeDelayError", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object mergeDelayError() {
//        return Flux.mergeDelayError();
//    }
//
//    @GetMapping(value = "/merge", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object merge() {
//        return Flux.merge();
//    }
//
//    @GetMapping(value = "/just", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object just() {
//        return Flux.just();
//    }
//
//    @GetMapping(value = "/interval", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object interval() {
//        return Flux.interval();
//    }
//
//    @GetMapping(value = "/generate", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object generate() {
//        return Flux.generate();
//    }
//
//    @GetMapping(value = "/fromStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object fromStream() {
//        return Flux.fromStream();
//    }
//
//    @GetMapping(value = "/fromIterable", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object fromIterable() {
//        return Flux.fromIterable();
//    }
//
//    @GetMapping(value = "/fromArray", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object fromArray() {
//        return Flux.fromArray();
//    }
//
//    @GetMapping(value = "/from", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object from() {
//        return Flux.from();
//    }
//
//    @GetMapping(value = "/first", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object first() {
//        return Flux.first();
//    }
//
//    @GetMapping(value = "/error", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object error() {
//        return Flux.error();
//    }
//
//    @GetMapping(value = "/empty", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object empty() {
//        return Flux.empty();
//    }
//
//    @GetMapping(value = "/deferWithContext", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object deferWithContext() {
//        return Flux.deferWithContext();
//    }
//
//    @GetMapping(value = "/defer", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object defer() {
//        return Flux.defer();
//    }
//
//    @GetMapping(value = "/create", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object create() {
//        return Flux.create();
//    }
//
//    @GetMapping(value = "/concatDelayError", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object concatDelayError() {
//        return Flux.concatDelayError();
//    }
//
//    @GetMapping(value = "/concat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object concat() {
//        return Flux.concat();
//    }
//
//    @GetMapping(value = "/combineLatest", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Object combineLatest() {
//        return Flux.combineLatest();
//    }
    @GetMapping(value = {"/combineLatest"})
    @ResponseBody
    public Flux<String> combineLatest(){
        Flux<String> stringFlux = Flux.combineLatest(
                Arrays::toString,
                Flux.interval(Duration.ofMillis(1000)).take(5),
                Flux.interval(Duration.ofMillis(50), Duration.ofMillis(1000)).take(5)
        );

        return stringFlux;
    }
}
